// 引入 router 在vuex内使用router跳转
import router from '@/router'
import asyncRouterMap from '@/router/async'
//所有tab
let sessioTabsKey = "tabs"
    //当前tab选项卡index
let sessioTabIndexKey = "tabIndex"
let tabStr = window.sessionStorage.getItem(sessioTabsKey)
let indexStr = window.sessionStorage.getItem(sessioTabIndexKey)
let tabsVal = null
if (tabStr && tabStr != "[]") {
    tabsVal = JSON.parse(tabStr)
}

let initTabs = []
    //  [{
    //     title: "参保人员信息",
    //     name: "insured",
    //     basePath: "/insured/",
    //     closable: false,
    // }]
let initIndex = ""


const tabs = {
    // 如果为true---->调用方法需添加命名空间 如tabviews/createTab
    namespaced: true,
    state: {
        //选项卡
        tabData: tabsVal || initTabs,
        //当前选项卡
        activeIndex: indexStr || initIndex,
    },
    // dispatch 触发--->actions 异步变更
    actions: {
        // 打开选项卡
        openTabs({ commit }, obj) {
            commit('ADD_TABS', obj)
        },
        //添加选项卡
        addTabs({ commit }, obj) {
            commit('ADD_TABS', obj)
        },
        //  移除选项卡
        removeTabs({ commit, state }, obj) {
            commit('REMOVE_TABS', obj)
        },
        //设置选项卡
        setTabs({ commit, state }, obj) {
            if (obj.clear) {
                window.sessionStorage.removeItem(sessioTabsKey)
                window.sessionStorage.removeItem(sessioTabIndexKey)
                state.tabData = [];
                state.activeIndex = "";
                return
            }

            //缓存设置
            if (obj.tabData) {
                state.tabData = obj.tabData;
                window.sessionStorage.setItem(sessioTabsKey, JSON.stringify(state.tabData));
            }

            if (obj.activeIndex) {
                window.sessionStorage.setItem(sessioTabIndexKey, state.activeIndex);
                state.activeIndex = obj.activeIndex
            }
        },
        //切换tab
        cutTabs({ commit }, index) {
            commit('CUT_TABS', index)
        }
    },
    // 外部方法 commit触发--->mutaions  同步变更
    mutations: {
        ADD_TABS(state, tab) {
            if (tab) {
                // 深拷贝 state.tabsPage
                const arr = JSON.parse(JSON.stringify(state.tabData));
                // 判断数组内是否为空
                if (arr.length > 0) {
                    /* 如果不存在将对象push进数组内bing */
                    // 检索是否重复出现tab-name
                    var ents = arr.filter((c) => c.name == tab.name);
                    if (ents.length == 0) {
                        // 如果不是第一个则可以移除选项卡
                        tab.closable = true

                        // 加入tabs选项卡中
                        state.tabData.push(tab);
                    }
                } else {
                    // 如果为0
                    // 将tabs所需参数push进arr数组
                    state.tabData.push(tab);
                }

                // 赋值给TabsValue参数
                state.activeIndex = tab.name;

                let obj = { path: tab.basePath }
                    //验证条件
                if (tab.query) {
                    obj.query = tab.query
                }
                if (tab.params) {
                    obj.params = tab.params
                }
                //跳转
                router.push(obj);
            }
        },
        CUT_TABS(state, index) {
            let basePath = "/";
            let tabpane = state.tabData.filter((c) => c.name == index);
            if (tabpane.length > 0) {
                basePath = tabpane[0].basePath;
            }
            state.activeIndex = index;

            router.push({
                path: basePath,
            });
        },
        REMOVE_TABS(state, targetIndex) {
            let tabs = state.tabData;
            // 获取当前选项卡
            let activeIndex = state.activeIndex;
            // 需要跳转地址
            let basePath = "/";
            // 是否当前选项卡
            let iscurrent = false;

            // 验证是否移除当前tab 是则定位下一个tab为当前tab
            if (activeIndex === targetIndex) {
                iscurrent = true;
                tabs.forEach((tab, index) => {
                    if (tab.name === targetIndex) {
                        let nextTab = tabs[index + 1] || tabs[index - 1];
                        if (nextTab) {
                            activeIndex = nextTab.name;
                        }
                    }
                });
            }

            // 验证选项卡数量
            if (state.tabData.length >= 1) {
                var ents = tabs.filter((tab) => tab.name == activeIndex);
                if (ents.length > 0) {
                    basePath = ents[0].basePath;
                }
            }

            // 获取需要移除tab
            state.tabData = tabs.filter((tab) => tab.name !== targetIndex);

            if (iscurrent) {
                state.activeIndex = activeIndex;
                router.push({
                    path: basePath,
                });
            }
        }
    }
}

export default tabs